library("plotly")
Loading required package: ggplot2

Attaching package: ‘plotly’

The following object is masked from ‘package:ggplot2’:

    last_plot

The following object is masked from ‘package:stats’:

    filter

The following object is masked from ‘package:graphics’:

    layout
library("plot3D")
library(tidyverse) # entorno tidy
Registered S3 methods overwritten by 'dbplyr':
  method         from
  print.tbl_lazy     
  print.tbl_sql      
── Attaching packages ─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse 1.3.0 ──
✓ tibble  3.1.6     ✓ dplyr   1.0.7
✓ tidyr   1.1.4     ✓ stringr 1.4.0
✓ readr   2.1.2     ✓ forcats 0.5.1
✓ purrr   0.3.4     
── Conflicts ────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────── tidyverse_conflicts() ──
x dplyr::filter() masks plotly::filter(), stats::filter()
x dplyr::lag()    masks stats::lag()
library(dplyr) # manejo de datos
library(GGally) # scatterplots multiples
Registered S3 method overwritten by 'GGally':
  method from   
  +.gg   ggplot2
library(rgl) # para graficos 3D
This build of rgl does not include OpenGL functions.  Use
 rglwidget() to display results, e.g. via options(rgl.printRglwidget = TRUE).
df = read.csv("chicos.csv", stringsAsFactors = F)
indices = (
  ! is.na(df$WEIGHT) &
  ! is.na(df$STATURE) &
  ! is.na(df$SEX) &
  ! is.na(df$RACE) &
  ! is.na(df$AGE.IN.YEARS) &
  ! is.na(df$AGE.IN.MONTHS) &
  df$WEIGHT>0 &
  df$STATURE>0 &
  df$RACE != 0 &
  (df$SEX == 1 | df$SEX==2)
    )

dfFiltrados = df[indices,]
dfFiltrados$WEIGHT = dfFiltrados$WEIGHT/10
dfFiltrados$STATURE = dfFiltrados$STATURE/10
dfFiltrados$AGE.IN.MONTHS = dfFiltrados$AGE.IN.MONTHS / 12
mujeres = dfFiltrados[dfFiltrados$SEX==2, ]
hombres = dfFiltrados[dfFiltrados$SEX==1,]
whites = dfFiltrados[dfFiltrados$RACE==1,]
blacks = dfFiltrados[dfFiltrados$RACE==2,]
unique(df$SEX)
[1] 2 1
range(dfFiltrados$AGE.IN.MONTHS)
[1]  24 240
range(dfFiltrados$AGE.IN.YEARS)*12/1000
[1]  24.180 240.648
View(dfFiltrados)
plot(dfFiltrados$WEIGHT, dfFiltrados$STATURE, xlab = "Peso en KG", ylab = "Altura en CM", col=dfFiltrados$SEX)

plot(dfFiltrados$AGE.IN.MONTHS, dfFiltrados$STATURE, col=dfFiltrados$SEX, xlab = "Edad (anios)", ylab = "Altura en CM",)

cPuntos = 1000
modAlturaEnEdad = lm(STATURE~poly(AGE.IN.MONTHS,2), data=dfFiltrados)
puntosIntervalo = seq(min(dfFiltrados$AGE.IN.MONTHS), max(dfFiltrados$AGE.IN.MONTHS), (range(dfFiltrados$AGE.IN.MONTHS)[2]- range(dfFiltrados$AGE.IN.MONTHS)[1])/cPuntos)

dataFrameEvaluar = data_frame(1:(cPuntos+1))
dataFrameEvaluar = cbind(dataFrameEvaluar,puntosIntervalo)
colnames(dataFrameEvaluar) = c("ind", "AGE.IN.MONTHS")

plot(dfFiltrados$AGE.IN.MONTHS,dfFiltrados$STATURE, xlab = "Edad en anios", ylab = "Altura en CM", main="Altura en funcion de edad de toda la poblacion")
lines(puntosIntervalo, predict(modAlturaEnEdad, newdata = dataFrameEvaluar), col='red', lwd=3)

modPesoEnEdad = lm(WEIGHT~poly(AGE.IN.MONTHS,2), data=dfFiltrados)

plot(dfFiltrados$AGE.IN.MONTHS,dfFiltrados$WEIGHT,  xlab = "Edad en anios", ylab = "PESO en kg", main="Peso en funcion de edad de toda la poblacion")
lines(puntosIntervalo, predict(modPesoEnEdad, newdata = dataFrameEvaluar), col='red', lwd=3)


modPesoEnEdadMuj = lm(WEIGHT~poly(AGE.IN.MONTHS,2), data=mujeres)

plot(mujeres$AGE.IN.MONTHS,mujeres$WEIGHT,  xlab = "Edad en anios", ylab = "PESO en kg", main="Peso en funcion de edad de mujeres")
lines(puntosIntervalo, predict(modPesoEnEdadMuj, newdata = dataFrameEvaluar), col='red', lwd=3)


modPesoEnEdadHom = lm(WEIGHT~poly(AGE.IN.MONTHS,2), data=hombres)

plot(hombres$AGE.IN.MONTHS,hombres$WEIGHT,  xlab = "Edad en anios", ylab = "PESO en kg", main="Peso en funcion de edad de hombres y mujeres", col='blue')

points(mujeres$AGE.IN.MONTHS,mujeres$WEIGHT,  xlab = "Edad en anios", ylab = "PESO en kg", main="Peso en funcion de edad de hombres", col='red')

lines(puntosIntervalo, predict(modPesoEnEdadHom, newdata = dataFrameEvaluar), col='light blue', lwd=3)
lines(puntosIntervalo, predict(modPesoEnEdadMuj, newdata = dataFrameEvaluar), col='pink', lwd=3)


modAlturaEnEdadHom = lm(STATURE~poly(AGE.IN.MONTHS,2), data=hombres)
modAlturaEnEdadMuj = lm(STATURE~poly(AGE.IN.MONTHS,2), data=mujeres)

plot(hombres$AGE.IN.MONTHS,hombres$STATURE,  xlab = "Edad en anios", ylab = "Altura en cm", main="Altura en funcion de edad de hombres y mujeres", col='blue')

points(mujeres$AGE.IN.MONTHS,mujeres$STATURE, col='red')

lines(puntosIntervalo, predict(modAlturaEnEdadHom, newdata = dataFrameEvaluar), col='light blue', lwd=3)
lines(puntosIntervalo, predict(modAlturaEnEdadMuj, newdata = dataFrameEvaluar), col='pink', lwd=3)


modAlturaEnEdadBlan = lm(STATURE~poly(AGE.IN.MONTHS,2), data=whites)
modAlturaEnEdadNeg = lm(STATURE~poly(AGE.IN.MONTHS,2), data=blacks)

plot(whites$AGE.IN.MONTHS,whites$STATURE,  xlab = "Edad en anios", ylab = "Altura en cm", main="Altura en funcion de edad de blancos y de color")

points(blacks$AGE.IN.MONTHS,blacks$STATURE, pch=19)

lines(puntosIntervalo, predict(modAlturaEnEdadBlan, newdata = dataFrameEvaluar), col='light blue', lwd=3)
lines(puntosIntervalo, predict(modAlturaEnEdadNeg, newdata = dataFrameEvaluar), col='pink', lwd=3)


modPesoEnEdadBlan = lm(WEIGHT~poly(AGE.IN.MONTHS,2), data=whites)
modPesoEnEdadNeg = lm(WEIGHT~poly(AGE.IN.MONTHS,2), data=blacks)

plot(whites$AGE.IN.MONTHS,whites$WEIGHT,  xlab = "Edad en anios", ylab = "Peso en KG", main="Peso en funcion de edad de blancos y de color")

points(blacks$AGE.IN.MONTHS,blacks$WEIGHT, pch=19)

lines(puntosIntervalo, predict(modPesoEnEdadBlan, newdata = dataFrameEvaluar), col='light blue', lwd=3)
lines(puntosIntervalo, predict(modPesoEnEdadNeg, newdata = dataFrameEvaluar), col='pink', lwd=3)

peso = dfFiltrados$WEIGHT/10
edad = dfFiltrados$AGE.IN.MONTHS/12
altura = dfFiltrados$STATURE/10
sexo = dfFiltrados$SEX
colores = c('blue','red')

fig <- plot_ly(x=~altura, y=~edad, z=~peso, marker = list(color = colores[dfFiltrados$SEX], showscale = F) , type="scatter3d", mode="markers", col=sexo, size = 1)
fig <- fig %>% layout(title = 'Peso en funcion de altura y edad'
         )

fig
Warning: 'scatter3d' objects don't have these attributes: 'col'
Valid attributes include:
'connectgaps', 'customdata', 'customdatasrc', 'error_x', 'error_y', 'error_z', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'line', 'marker', 'meta', 'metasrc', 'mode', 'name', 'opacity', 'projection', 'scene', 'showlegend', 'stream', 'surfaceaxis', 'surfacecolor', 'text', 'textfont', 'textposition', 'textpositionsrc', 'textsrc', 'texttemplate', 'texttemplatesrc', 'transforms', 'type', 'uid', 'uirevision', 'visible', 'x', 'xcalendar', 'xhoverformat', 'xsrc', 'y', 'ycalendar', 'yhoverformat', 'ysrc', 'z', 'zcalendar', 'zhoverformat', 'zsrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_isGraticule', '_bbox'

Warning: 'scatter3d' objects don't have these attributes: 'col'
Valid attributes include:
'connectgaps', 'customdata', 'customdatasrc', 'error_x', 'error_y', 'error_z', 'hoverinfo', 'hoverinfosrc', 'hoverlabel', 'hovertemplate', 'hovertemplatesrc', 'hovertext', 'hovertextsrc', 'ids', 'idssrc', 'legendgroup', 'legendgrouptitle', 'legendrank', 'line', 'marker', 'meta', 'metasrc', 'mode', 'name', 'opacity', 'projection', 'scene', 'showlegend', 'stream', 'surfaceaxis', 'surfacecolor', 'text', 'textfont', 'textposition', 'textpositionsrc', 'textsrc', 'texttemplate', 'texttemplatesrc', 'transforms', 'type', 'uid', 'uirevision', 'visible', 'x', 'xcalendar', 'xhoverformat', 'xsrc', 'y', 'ycalendar', 'yhoverformat', 'ysrc', 'z', 'zcalendar', 'zhoverformat', 'zsrc', 'key', 'set', 'frame', 'transforms', '_isNestedKey', '_isSimpleKey', '_isGraticule', '_bbox'
table(dfFiltrados$RACE)

   1    2    3    4    5 
3370  426   31    6   51 
#Cinco niveles, WHITE = 1, BLACK = 2, ORIENTAL = 3, AMERICAN INDIAN = 4, MIXED = 5.
#Absoluta disparidad de muestreo en cuanto a raza.

table(dfFiltrados$SEX)

   1    2 
1972 1912 
#En cuanto a sexo no

Las personas mas pesadas, desarollan piernas mas anchas para soportar su peso que alguien de su misma altura menos pesada?

Podemos identificar a las personas con enanismo? ademas de menor altura para su edad, que otras variables tienen fundamentalmente distintas?

A que edad pegan “el estiron” los hombres y cuando las mujeres? existe un momento concreto? Ademas de altura, que otras medidas cambian considerablemente? (medida de cintura en mujeres por ej, ensanchamiento de espalda hombres?)

LS0tCnRpdGxlOiAiUiBOb3RlYm9vayIKb3V0cHV0OiBodG1sX25vdGVib29rCi0tLQpgYGB7cn0KbGlicmFyeSgicGxvdGx5IikKbGlicmFyeSgicGxvdDNEIikKbGlicmFyeSh0aWR5dmVyc2UpICMgZW50b3JubyB0aWR5CmxpYnJhcnkoZHBseXIpICMgbWFuZWpvIGRlIGRhdG9zCmxpYnJhcnkoR0dhbGx5KSAjIHNjYXR0ZXJwbG90cyBtdWx0aXBsZXMKbGlicmFyeShyZ2wpICMgcGFyYSBncmFmaWNvcyAzRApgYGAKCgpgYGB7cn0KZGYgPSByZWFkLmNzdigiY2hpY29zLmNzdiIsIHN0cmluZ3NBc0ZhY3RvcnMgPSBGKQpgYGAKYGBge3J9CmluZGljZXMgPSAoCiAgISBpcy5uYShkZiRXRUlHSFQpICYKICAhIGlzLm5hKGRmJFNUQVRVUkUpICYKICAhIGlzLm5hKGRmJFNFWCkgJgogICEgaXMubmEoZGYkUkFDRSkgJgogICEgaXMubmEoZGYkQUdFLklOLllFQVJTKSAmCiAgISBpcy5uYShkZiRBR0UuSU4uTU9OVEhTKSAmCiAgZGYkV0VJR0hUPjAgJgogIGRmJFNUQVRVUkU+MCAmCiAgZGYkUkFDRSAhPSAwICYKICAoZGYkU0VYID09IDEgfCBkZiRTRVg9PTIpCiAgICApCgpkZkZpbHRyYWRvcyA9IGRmW2luZGljZXMsXQpkZkZpbHRyYWRvcyRXRUlHSFQgPSBkZkZpbHRyYWRvcyRXRUlHSFQvMTAKZGZGaWx0cmFkb3MkU1RBVFVSRSA9IGRmRmlsdHJhZG9zJFNUQVRVUkUvMTAKZGZGaWx0cmFkb3MkQUdFLklOLk1PTlRIUyA9IGRmRmlsdHJhZG9zJEFHRS5JTi5NT05USFMgLyAxMgptdWplcmVzID0gZGZGaWx0cmFkb3NbZGZGaWx0cmFkb3MkU0VYPT0yLCBdCmhvbWJyZXMgPSBkZkZpbHRyYWRvc1tkZkZpbHRyYWRvcyRTRVg9PTEsXQp3aGl0ZXMgPSBkZkZpbHRyYWRvc1tkZkZpbHRyYWRvcyRSQUNFPT0xLF0KYmxhY2tzID0gZGZGaWx0cmFkb3NbZGZGaWx0cmFkb3MkUkFDRT09MixdCmBgYAoKYGBge3J9CnVuaXF1ZShkZiRTRVgpCmBgYAoKYGBge3J9CnJhbmdlKGRmRmlsdHJhZG9zJEFHRS5JTi5NT05USFMpCnJhbmdlKGRmRmlsdHJhZG9zJEFHRS5JTi5ZRUFSUykqMTIvMTAwMAoKYGBgCgpgYGB7cn0KVmlldyhkZkZpbHRyYWRvcykKYGBgCgpgYGB7cn0KcGxvdChkZkZpbHRyYWRvcyRXRUlHSFQsIGRmRmlsdHJhZG9zJFNUQVRVUkUsIHhsYWIgPSAiUGVzbyBlbiBLRyIsIHlsYWIgPSAiQWx0dXJhIGVuIENNIiwgY29sPWRmRmlsdHJhZG9zJFNFWCkKYGBgCgoKYGBge3J9CnBsb3QoZGZGaWx0cmFkb3MkQUdFLklOLk1PTlRIUywgZGZGaWx0cmFkb3MkU1RBVFVSRSwgY29sPWRmRmlsdHJhZG9zJFNFWCwgeGxhYiA9ICJFZGFkIChhbmlvcykiLCB5bGFiID0gIkFsdHVyYSBlbiBDTSIsKQpgYGAKYGBge3J9CmNQdW50b3MgPSAxMDAwCm1vZEFsdHVyYUVuRWRhZCA9IGxtKFNUQVRVUkV+cG9seShBR0UuSU4uTU9OVEhTLDIpLCBkYXRhPWRmRmlsdHJhZG9zKQpwdW50b3NJbnRlcnZhbG8gPSBzZXEobWluKGRmRmlsdHJhZG9zJEFHRS5JTi5NT05USFMpLCBtYXgoZGZGaWx0cmFkb3MkQUdFLklOLk1PTlRIUyksIChyYW5nZShkZkZpbHRyYWRvcyRBR0UuSU4uTU9OVEhTKVsyXS0gcmFuZ2UoZGZGaWx0cmFkb3MkQUdFLklOLk1PTlRIUylbMV0pL2NQdW50b3MpCgpkYXRhRnJhbWVFdmFsdWFyID0gZGF0YV9mcmFtZSgxOihjUHVudG9zKzEpKQpkYXRhRnJhbWVFdmFsdWFyID0gY2JpbmQoZGF0YUZyYW1lRXZhbHVhcixwdW50b3NJbnRlcnZhbG8pCmNvbG5hbWVzKGRhdGFGcmFtZUV2YWx1YXIpID0gYygiaW5kIiwgIkFHRS5JTi5NT05USFMiKQoKcGxvdChkZkZpbHRyYWRvcyRBR0UuSU4uTU9OVEhTLGRmRmlsdHJhZG9zJFNUQVRVUkUsIHhsYWIgPSAiRWRhZCBlbiBhbmlvcyIsIHlsYWIgPSAiQWx0dXJhIGVuIENNIiwgbWFpbj0iQWx0dXJhIGVuIGZ1bmNpb24gZGUgZWRhZCBkZSB0b2RhIGxhIHBvYmxhY2lvbiIpCmxpbmVzKHB1bnRvc0ludGVydmFsbywgcHJlZGljdChtb2RBbHR1cmFFbkVkYWQsIG5ld2RhdGEgPSBkYXRhRnJhbWVFdmFsdWFyKSwgY29sPSdyZWQnLCBsd2Q9MykKYGBgCmBgYHtyfQptb2RQZXNvRW5FZGFkID0gbG0oV0VJR0hUfnBvbHkoQUdFLklOLk1PTlRIUywyKSwgZGF0YT1kZkZpbHRyYWRvcykKCnBsb3QoZGZGaWx0cmFkb3MkQUdFLklOLk1PTlRIUyxkZkZpbHRyYWRvcyRXRUlHSFQsICB4bGFiID0gIkVkYWQgZW4gYW5pb3MiLCB5bGFiID0gIlBFU08gZW4ga2ciLCBtYWluPSJQZXNvIGVuIGZ1bmNpb24gZGUgZWRhZCBkZSB0b2RhIGxhIHBvYmxhY2lvbiIpCmxpbmVzKHB1bnRvc0ludGVydmFsbywgcHJlZGljdChtb2RQZXNvRW5FZGFkLCBuZXdkYXRhID0gZGF0YUZyYW1lRXZhbHVhciksIGNvbD0ncmVkJywgbHdkPTMpCmBgYApgYGB7cn0KCm1vZFBlc29FbkVkYWRNdWogPSBsbShXRUlHSFR+cG9seShBR0UuSU4uTU9OVEhTLDIpLCBkYXRhPW11amVyZXMpCgpwbG90KG11amVyZXMkQUdFLklOLk1PTlRIUyxtdWplcmVzJFdFSUdIVCwgIHhsYWIgPSAiRWRhZCBlbiBhbmlvcyIsIHlsYWIgPSAiUEVTTyBlbiBrZyIsIG1haW49IlBlc28gZW4gZnVuY2lvbiBkZSBlZGFkIGRlIG11amVyZXMiKQpsaW5lcyhwdW50b3NJbnRlcnZhbG8sIHByZWRpY3QobW9kUGVzb0VuRWRhZE11aiwgbmV3ZGF0YSA9IGRhdGFGcmFtZUV2YWx1YXIpLCBjb2w9J3JlZCcsIGx3ZD0zKQpgYGAKYGBge3J9Cgptb2RQZXNvRW5FZGFkSG9tID0gbG0oV0VJR0hUfnBvbHkoQUdFLklOLk1PTlRIUywyKSwgZGF0YT1ob21icmVzKQoKcGxvdChob21icmVzJEFHRS5JTi5NT05USFMsaG9tYnJlcyRXRUlHSFQsICB4bGFiID0gIkVkYWQgZW4gYW5pb3MiLCB5bGFiID0gIlBFU08gZW4ga2ciLCBtYWluPSJQZXNvIGVuIGZ1bmNpb24gZGUgZWRhZCBkZSBob21icmVzIHkgbXVqZXJlcyIsIGNvbD0nYmx1ZScpCgpwb2ludHMobXVqZXJlcyRBR0UuSU4uTU9OVEhTLG11amVyZXMkV0VJR0hULCAgeGxhYiA9ICJFZGFkIGVuIGFuaW9zIiwgeWxhYiA9ICJQRVNPIGVuIGtnIiwgbWFpbj0iUGVzbyBlbiBmdW5jaW9uIGRlIGVkYWQgZGUgaG9tYnJlcyIsIGNvbD0ncmVkJykKCmxpbmVzKHB1bnRvc0ludGVydmFsbywgcHJlZGljdChtb2RQZXNvRW5FZGFkSG9tLCBuZXdkYXRhID0gZGF0YUZyYW1lRXZhbHVhciksIGNvbD0nbGlnaHQgYmx1ZScsIGx3ZD0zKQpsaW5lcyhwdW50b3NJbnRlcnZhbG8sIHByZWRpY3QobW9kUGVzb0VuRWRhZE11aiwgbmV3ZGF0YSA9IGRhdGFGcmFtZUV2YWx1YXIpLCBjb2w9J3BpbmsnLCBsd2Q9MykKCmBgYAoKYGBge3J9Cgptb2RBbHR1cmFFbkVkYWRIb20gPSBsbShTVEFUVVJFfnBvbHkoQUdFLklOLk1PTlRIUywyKSwgZGF0YT1ob21icmVzKQptb2RBbHR1cmFFbkVkYWRNdWogPSBsbShTVEFUVVJFfnBvbHkoQUdFLklOLk1PTlRIUywyKSwgZGF0YT1tdWplcmVzKQoKcGxvdChob21icmVzJEFHRS5JTi5NT05USFMsaG9tYnJlcyRTVEFUVVJFLCAgeGxhYiA9ICJFZGFkIGVuIGFuaW9zIiwgeWxhYiA9ICJBbHR1cmEgZW4gY20iLCBtYWluPSJBbHR1cmEgZW4gZnVuY2lvbiBkZSBlZGFkIGRlIGhvbWJyZXMgeSBtdWplcmVzIiwgY29sPSdibHVlJykKCnBvaW50cyhtdWplcmVzJEFHRS5JTi5NT05USFMsbXVqZXJlcyRTVEFUVVJFLCBjb2w9J3JlZCcpCgpsaW5lcyhwdW50b3NJbnRlcnZhbG8sIHByZWRpY3QobW9kQWx0dXJhRW5FZGFkSG9tLCBuZXdkYXRhID0gZGF0YUZyYW1lRXZhbHVhciksIGNvbD0nbGlnaHQgYmx1ZScsIGx3ZD0zKQpsaW5lcyhwdW50b3NJbnRlcnZhbG8sIHByZWRpY3QobW9kQWx0dXJhRW5FZGFkTXVqLCBuZXdkYXRhID0gZGF0YUZyYW1lRXZhbHVhciksIGNvbD0ncGluaycsIGx3ZD0zKQoKYGBgCmBgYHtyfQoKbW9kQWx0dXJhRW5FZGFkQmxhbiA9IGxtKFNUQVRVUkV+cG9seShBR0UuSU4uTU9OVEhTLDIpLCBkYXRhPXdoaXRlcykKbW9kQWx0dXJhRW5FZGFkTmVnID0gbG0oU1RBVFVSRX5wb2x5KEFHRS5JTi5NT05USFMsMiksIGRhdGE9YmxhY2tzKQoKcGxvdCh3aGl0ZXMkQUdFLklOLk1PTlRIUyx3aGl0ZXMkU1RBVFVSRSwgIHhsYWIgPSAiRWRhZCBlbiBhbmlvcyIsIHlsYWIgPSAiQWx0dXJhIGVuIGNtIiwgbWFpbj0iQWx0dXJhIGVuIGZ1bmNpb24gZGUgZWRhZCBkZSBibGFuY29zIHkgZGUgY29sb3IiKQoKcG9pbnRzKGJsYWNrcyRBR0UuSU4uTU9OVEhTLGJsYWNrcyRTVEFUVVJFLCBwY2g9MTkpCgpsaW5lcyhwdW50b3NJbnRlcnZhbG8sIHByZWRpY3QobW9kQWx0dXJhRW5FZGFkQmxhbiwgbmV3ZGF0YSA9IGRhdGFGcmFtZUV2YWx1YXIpLCBjb2w9J2xpZ2h0IGJsdWUnLCBsd2Q9MykKbGluZXMocHVudG9zSW50ZXJ2YWxvLCBwcmVkaWN0KG1vZEFsdHVyYUVuRWRhZE5lZywgbmV3ZGF0YSA9IGRhdGFGcmFtZUV2YWx1YXIpLCBjb2w9J3BpbmsnLCBsd2Q9MykKCmBgYApgYGB7cn0KCm1vZFBlc29FbkVkYWRCbGFuID0gbG0oV0VJR0hUfnBvbHkoQUdFLklOLk1PTlRIUywyKSwgZGF0YT13aGl0ZXMpCm1vZFBlc29FbkVkYWROZWcgPSBsbShXRUlHSFR+cG9seShBR0UuSU4uTU9OVEhTLDIpLCBkYXRhPWJsYWNrcykKCnBsb3Qod2hpdGVzJEFHRS5JTi5NT05USFMsd2hpdGVzJFdFSUdIVCwgIHhsYWIgPSAiRWRhZCBlbiBhbmlvcyIsIHlsYWIgPSAiUGVzbyBlbiBLRyIsIG1haW49IlBlc28gZW4gZnVuY2lvbiBkZSBlZGFkIGRlIGJsYW5jb3MgeSBkZSBjb2xvciIpCgpwb2ludHMoYmxhY2tzJEFHRS5JTi5NT05USFMsYmxhY2tzJFdFSUdIVCwgcGNoPTE5KQoKbGluZXMocHVudG9zSW50ZXJ2YWxvLCBwcmVkaWN0KG1vZFBlc29FbkVkYWRCbGFuLCBuZXdkYXRhID0gZGF0YUZyYW1lRXZhbHVhciksIGNvbD0nbGlnaHQgYmx1ZScsIGx3ZD0zKQpsaW5lcyhwdW50b3NJbnRlcnZhbG8sIHByZWRpY3QobW9kUGVzb0VuRWRhZE5lZywgbmV3ZGF0YSA9IGRhdGFGcmFtZUV2YWx1YXIpLCBjb2w9J3BpbmsnLCBsd2Q9MykKCmBgYApgYGB7cn0KcGVzbyA9IGRmRmlsdHJhZG9zJFdFSUdIVAplZGFkID0gZGZGaWx0cmFkb3MkQUdFLklOLk1PTlRIUwphbHR1cmEgPSBkZkZpbHRyYWRvcyRTVEFUVVJFCnNleG8gPSBkZkZpbHRyYWRvcyRTRVgKY29sb3JlcyA9IGMoJ2JsdWUnLCdyZWQnKQoKZmlnIDwtIHBsb3RfbHkoeD1+YWx0dXJhLCB5PX5lZGFkLCB6PX5wZXNvLCBtYXJrZXIgPSBsaXN0KGNvbG9yID0gY29sb3Jlc1tkZkZpbHRyYWRvcyRTRVhdLCBzaG93c2NhbGUgPSBGKSAsIHR5cGU9InNjYXR0ZXIzZCIsIG1vZGU9Im1hcmtlcnMiLCBjb2w9c2V4bywgc2l6ZSA9IDEpCmZpZyA8LSBmaWcgJT4lIGxheW91dCh0aXRsZSA9ICdQZXNvIGVuIGZ1bmNpb24gZGUgYWx0dXJhIHkgZWRhZCcKICAgICAgICAgKQoKZmlnCmBgYApgYGB7cn0KdGFibGUoZGZGaWx0cmFkb3MkUkFDRSkKI0NpbmNvIG5pdmVsZXMsIFdISVRFID0gMSwgQkxBQ0sgPSAyLCBPUklFTlRBTCA9IDMsIEFNRVJJQ0FOIElORElBTiA9IDQsIE1JWEVEID0gNS4KI0Fic29sdXRhIGRpc3BhcmlkYWQgZGUgbXVlc3RyZW8gZW4gY3VhbnRvIGEgcmF6YS4KCnRhYmxlKGRmRmlsdHJhZG9zJFNFWCkKI0VuIGN1YW50byBhIHNleG8gbm8KYGBgCgpMYXMgcGVyc29uYXMgbWFzIHBlc2FkYXMsIGRlc2Fyb2xsYW4gcGllcm5hcyBtYXMgYW5jaGFzIHBhcmEgc29wb3J0YXIgc3UgcGVzbyBxdWUgYWxndWllbiBkZSBzdSBtaXNtYSBhbHR1cmEgbWVub3MgcGVzYWRhPwoKUG9kZW1vcyBpZGVudGlmaWNhciBhIGxhcyBwZXJzb25hcyBjb24gZW5hbmlzbW8/IGFkZW1hcyBkZSBtZW5vciBhbHR1cmEgcGFyYSBzdSBlZGFkLCBxdWUgb3RyYXMgdmFyaWFibGVzIHRpZW5lbiBmdW5kYW1lbnRhbG1lbnRlIGRpc3RpbnRhcz8KCkEgcXVlIGVkYWQgcGVnYW4gImVsIGVzdGlyb24iIGxvcyBob21icmVzIHkgY3VhbmRvIGxhcyBtdWplcmVzPyBleGlzdGUgdW4gbW9tZW50byBjb25jcmV0bz8gQWRlbWFzIGRlIGFsdHVyYSwgcXVlIG90cmFzIG1lZGlkYXMgY2FtYmlhbiBjb25zaWRlcmFibGVtZW50ZT8gKG1lZGlkYSBkZSBjaW50dXJhIGVuIG11amVyZXMgcG9yIGVqLCBlbnNhbmNoYW1pZW50byBkZSBlc3BhbGRhIGhvbWJyZXM/KQoK